package simulado;


public class ListasSimuladoImpl implements ListasSimulado{
	
	private Node ultimoNode(Node lista){
		Node ultimo = lista;
		if(ultimo != null){
			while(ultimo.proximo != null){
				ultimo = ultimo.proximo;
			}
		}
		return ultimo;
	}

	public Node elementosDiferentes(Node lista1, Node lista2) {
		Node node1, node2;
		Node diferentes = null;
		
		if(lista1 != null || lista2 != null){
			boolean contemIgual;
			Node iguais = null;
			
			node1 = lista1;
			while(node1 != null){
				
				node2 = lista2;
				contemIgual = false;
				for(int i = 0; node2 != null; i++){
					if(node1.elemento == node2.elemento){
						contemIgual = true;
						if(iguais == null){
							iguais = new Node(i);
						}else{
							ultimoNode(iguais).proximo = new Node(i);
						}
					}
					node2 = node2.proximo;
				}
				if(!contemIgual){
					if(diferentes == null){
						diferentes = new Node(node1.elemento);
					}else{
						ultimoNode(diferentes).proximo = new Node(node1.elemento);;
					}
				}
				node1 = node1.proximo;
			}
			
			node2 = lista2;
			Node nodeIgual;
			boolean contem;
			
			for(int i = 0; node2 != null; i++){
				nodeIgual = iguais;
				contem = false;
				while(nodeIgual != null && !contem){
					if(nodeIgual.elemento == i){
						contem = true;
					}
					nodeIgual = nodeIgual.proximo;
				}
				
				if(!contem){
					if(diferentes == null){
						diferentes = new Node(node2.elemento);
					}else{
						ultimoNode(diferentes).proximo = new Node(node2.elemento);;
					}
				}
				node2 = node2.proximo;
			}
			
		}
		return diferentes;
	}

	@Override
	public Node elementosNasPosicoes(Node lista1, Node listaPosicoes) {
		Node listaFinal = null;
		if(lista1 != null && listaPosicoes != null){
			Node noPosicao = listaPosicoes;
			Node node1;
			while(noPosicao != null){
				
				if(noPosicao.elemento >= 0){
					node1 = lista1;
					for(int i = 0; i < noPosicao.elemento && node1 != null; i++){
						node1 = node1.proximo;
					}
					if(node1 != null){
						if(listaFinal == null){
							listaFinal = new Node(node1.elemento);
						}else{
							ultimoNode(listaFinal).proximo = new Node(node1.elemento);
						}
					}
				}
				noPosicao = noPosicao.proximo;
			}
		}
		return listaFinal;
	}
	
	public static void main(String[] args) {
		
		ListasSimuladoImpl l = new ListasSimuladoImpl();
		
		Node lista1 = new Node(5, new Node(4, new Node(11, new Node(111))));
		Node lista2 = new Node(2, new Node(10, new Node(9)));
		Node diferentes = l.elementosDiferentes(lista1, lista2);
		
		boolean first = true;
		while(diferentes != null){
			if(first){
				System.out.print(diferentes.elemento);
				first = false;
			}else{
				System.out.print(", " + diferentes.elemento);
			}
			diferentes = diferentes.proximo;
		}
		
	}

}
